package com.itheima.d1_create_thread;

/**
 * 目标：掌握多线程的创建方式二：实现Runnable接口。
 *
 *多线程的创建方式二：实现Runnable接口
 *  1、定义一个线程任务类MyRunnable实现Runnable接口，重写run()方法
 *  2、创建MyRunnable任务对象，这个并不是线程对象
 *  3、把MyRunnable任务对象交给Thread的有参构造器处理，封装Runnable对象为线程对象
 *  4、调用线程对象的start()方法启动线程
 *      Thread类提供的构造器
 *  public Thread(Runnable target)      封装Runnable对象成为线程对象
 *
 *方式二的优缺点
 * 优点：任务类只是实现接口，可以继续继承其他类、实现其他接口，扩展性强。
 * 缺点：需要多一个Runnable对象。
 *
 * 线程创建方式二是如何创建线程的？
 * 定义一个线程任务类MyRunnable实现Runnable接口，重写run()方法
 * 创建MyRunnable对象
 * 把MyRunnable任务对象交给Thread线程对象处理。
 * 调用线程对象的start()方法启动线程
 * 方式二的优缺点是啥？
 * 优点：线程任务类只是实现了Runnale接口，可以继续继承和实现。
 * 缺点：如果线程有执行结果是不能直接返回的。
 *
 *  Thread提供的常见构造器
 * public Thread(String name)                   可以为当前线程指定名称
 * public Thread(Runnable target)               封装Runnable对象成为线程对象
 * public Thread(Runnable target, String name)  封装Runnable对象成为线程对象，并指定线程名称
 */
public class ThreadTest2 {
    public static void main(String[] args) {
        // 3、创建MyRunnable任务对象，这个并不是线程对象
        Runnable target = new MyRunnable();     //多态写法

        // 4、把MyRunnable任务对象交给Thread的有参构造器处理。
        //  public Thread(Runnable target)      封装Runnable对象成为线程对象
        new Thread(target).start();

        /*
        Runnable接口的源码，是函数式接口，只有一个抽象方法，所以也可以用匿名内部类（我正想着这个，原来视频接着就讲解了这个哈哈哈）
        @FunctionalInterface
public interface Runnable {
         */

        //这种形式创建线程的话，运行结果永远是优先被CPU调用执行，原因？
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i=0;i<=3;i++) {
                    System.out.println("匿名内部类的子线程");
                }
            }
        }).start();

        for (int i = 1; i <= 5; i++) {
            System.out.println("主线程main输出 ===》" + i);
        }
    }
}
